﻿#pragma warning(disable: 4996)
#pragma warning(disable: 6031)

/*
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序，求一个给定的n阶方阵的鞍点。

输入格式：
输入第一行给出一个正整数n（1≤n≤6）。随后n行，每行给出n个整数，其间以空格分隔。

输出格式：
输出在一行中按照“行下标 列下标”（下标从0开始）的格式输出鞍点的位置。如果鞍点不存在，则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1：
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1：
2 1
输入样例2：
2
1 7
4 1
输出样例2：
NONE
*/

#include <stdlib.h>
#include <stdio.h>

typedef struct _Matrix {
	int n;
	int size;
	int* data;
}Matrix;

Matrix matrix_create(int n) {
	Matrix mat;
	mat.n = n;
	mat.size = n * n;
	mat.data = (int*)malloc(sizeof(int) * mat.size);
	return mat;
}

int* matrix_at(Matrix* m, int i, int j) {
	return m->data + i * m->n + j;
}

Matrix matrix;

void read_data() {
	int n;
	scanf("%d", &n);
	matrix = matrix_create(n);
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			scanf("%d", matrix_at(&matrix, i, j));
}

int matrix_all_ge(Matrix* m, int v, int j) {
	for (int i = 0; i < m->n; ++i) {
		if (*matrix_at(&matrix, i, j) < v) {
			return 0;
		}
	}
	return 1;
}

void solve() {
	int rmax = 0;
	int j_min = 0;
	for (int i = 0; i < matrix.n; ++i) {
		rmax = *matrix_at(&matrix, i, 0);
		for (int j = 1; j < matrix.n; ++j) {
			if (rmax < *matrix_at(&matrix, i, j)) {
				rmax = *matrix_at(&matrix, i, j);	//要点, 一行可以有多个相等的最大值
			}
		}
		for (int j = 0; j < matrix.n; ++j) {
			j_min = *matrix_at(&matrix, 0, j);
			for (int k = 0; k < matrix.n; ++k) {
				if (*matrix_at(&matrix, k, j) < j_min) {
					j_min = *matrix_at(&matrix, k, j);
				}
			}
			if (rmax == j_min) {
				printf("%d %d\n", i, j);
				return;
			}
		}

	}
	printf("NONE\n");
}

int main()
{
	freopen("D:/Develop/GitRepos/MOOC/浙江大学/数据结构/201906/DataStructure/M2019秋C入门和进阶练习集/7-56.txt", "r", stdin);
	read_data();
	solve();
	return 0;
}

//freopen("D:/Develop/GitRepos/MOOC/浙江大学/数据结构/201906/DataStructure/M2019秋C入门和进阶练习集/7-50.txt", "r", stdin);
